import { log } from "console";

// interface Person {
/**
 * 名称
 */
// name: string
/**
 * 性别
 */
// sex: string
/**
* 年龄
*/
// age: number
// }



// const obj12: Person = {
//   name: 'zhichao',
//   age: 23,
//   sex: 'nan'
// }




// export interface InterfaceUserData {

//   // 可选： dept_id, gender?, id, is_deleted
//   /**
//    * 头像
//    */
//   avatar: string;
//   create_by: number;
//   dept_id?: number | undefined;
//   /**
//    * 邮箱
//    */
//   email: string;
//   /**
//    * 性别
//    */
//   gender?: number | undefined;
//   id?: number | undefined;
//   is_deleted?: number | undefined;
//   /**
//    * 手机号
//    */
//   mobile?: string | undefined;
//   /**
//    * 昵称
//    */
//   nickname?: string | undefined;
//   /**
//    * 密码
//    */
//   password?: string | undefined;
//   /**
//    * 状态
//    */
//   status?: number | undefined;
//   update_by?: number | undefined;
//   /**
//    * 用户名
//    */
//   readonly username: string;

//   // 额外的属性检查//允许添加新的任意属性
//   [property: string]: string | number | boolean | undefined;
// }


// let user1: InterfaceUserData = {
//   username: 'zhichao',
//   avatar: './touxiang.png',
//   create_by: 2342342,
//   email: '234@qq.com',
//   aihao: 'jk',
//   gongji: 100,
//   isNvpengyou: false
// }




// // user1.username = 'zhichao2' // 无法为“username”赋值，因为它是只读属性。ts(2540)


// // 使用interface定义函数类型

// interface IFun1 {
//   (a: string, b: number): void
// }

// let fun111: IFun1 = function () {
//   return '22'
// }


// console.log(fun111('234', 2323));



// function fun222(): void {
//   // return 222 // 不能将类型“number”分配给类型“void”。ts(2322)
// }

// console.log(fun222());



// // 重名合并

// interface IA {
//   name: string
// }
// interface IA {
//   sex: string
// }
// interface IA {
//   age: string
// }
// interface IA {
//   love: string
// }


// let obj10: IA = {
//   age: '234',
//   name: 'chao',
//   sex: 'nan',
//   love: 'nv'
// }



// //继承
// interface IA1 {
//   name: string
// }

// interface IB1 extends IA1 {
//   name: string
//   age: number
// }

// let obj: IB1 = {
//   age: 18,
//   name: "string"
// }
// interface IDataBaseForm {
//   /**
//    * 头像
//    */
//   avatar: string;
//   create_by: number;
//   dept_id: number;
//   /**
//    * 邮箱
//    */
//   email: string;
//   /**
//    * 性别
//    */
//   gender: number;
//   id: number;
//   is_deleted: number;
// }
// export interface IData extends IDataBaseForm, IB1 {
//   /**
//    * 手机号
//    */
//   mobile: string;
//   /**
//    * 昵称
//    */
//   nickname: string;
//   /**
//    * 密码
//    */
//   password: string;
//   /**
//    * 状态
//    */
//   status: number;
//   update_by: number;
//   /**
//    * 用户名
//    */
//   username: string;
//   [property: string]: any;
// }
// interface Counter {
//   (start: number): string;  // 函数
//   interval: number;   // 属性
//   reset(): void;   // 定好的函数:具名函数
// }
// function getCounter(): Counter {
//   // <Counter>把右边的函数类型转化为Counter
//   let c = <Counter>function (start: number) { }
//   c.interval = 2332
//   c.reset = function () { }
//   return c
// }
// class Control {
//   private state: any;
// }
// interface SelectableControl extends Control {
//   select(): void;
// }
// interface AAA {
//   select(): void;
// }
// class name implements AAA {
//   constructor() {
//   }
//   select() {
//   }
// }
// interface InameEx extends name {
// }
// 定义对象结构
// 代表了有一个lable属性且类型为string的对象
interface LabelledValue {
  label: string;
}
function printLabel(labelledObj: LabelledValue) {
  console.log(labelledObj.label);
}
console.log('---------------');
let myObj = {
  size: 10, label: "Size  Object"
};
printLabel(myObj);
console.log(myObj);

// 可选属性的含义是该属性可以不存在，所以这样写也是没问题的
interface Person {
  b?: string
  a: string
}
const person: Person = {
  a: "213"
}

// 额外的属性检查
// 只能在对象刚刚创建的时候修改其值,赋值后，再也不能被改变了
interface Point {
  readonly x: number;
  readonly y: number;
}
let p1: Point = { x: 10, y: 20 };
// p1.x = 5;//error!只读属性不能赋值

// 额外的属性检查
// 在这个例子当中我们看到接口中并没有定义C但是并没有报错
//应为我们定义了[propName: string]: any;
//允许添加新的任意属性

interface Person {
  b?: string;
  a: string;
  [propName: string]: any;
}
const person666: Person = {
  a: "213",
  c: "123",
  d: 777
}
console.log(person666);

// 函数类型
// 使用接口表示函数类型，我们需要给接口定义一个调用签名
interface SearchFunc {
  (source: string, subString: string): boolean;
}
// 调用
let mySearch: SearchFunc;
mySearch = function (source: string, subString: string) {
  let result = source.search(subString);
  return result > -1;
}
console.log(mySearch("123", "1"));

// 使用接口声明一个没有返回值没有形参的函数类型 Func 。
interface Func {
  (): void;
}



